﻿using System;
using System.Linq;
using VO;
using System.Collections.Generic;

namespace DAL
{
    public class HistoricoAtendimentoDAL
    {

        #region InsereHistoricoAtendimento
        public void InsereHistoricoAtendimento(HistoricoAtendimento obj)
        {
            using (CallcenterEntities data = new CallcenterEntities())
            {
                var tbHistoricoAtendimento = new tbCCHistoricoAtendimento();

                tbHistoricoAtendimento.idCampanha = obj.idCampanha;
                tbHistoricoAtendimento.idOperador = obj.idOperador;
                tbHistoricoAtendimento.idCliente = obj.idCliente;
                tbHistoricoAtendimento.idStatus = obj.idStatus;
                tbHistoricoAtendimento.dtHistorico = DateTime.Now;
                tbHistoricoAtendimento.idProposta = obj.idProposta;
                tbHistoricoAtendimento.comentario = obj.comentario;
                tbHistoricoAtendimento.dtInicioAtendimento = obj.dtInicioAtendimento;

                data.AddTotbCCHistoricoAtendimento(tbHistoricoAtendimento);
                data.SaveChanges();
            }
        }
        #endregion

        #region Insert
        public void Insert(HistoricoAtendimento obj)
        {
            using (var contexto = new CallcenterEntities())
            {
                var objC = new tbCCHistoricoAtendimento();
                objC = PopulaObjeto(obj, objC);
                contexto.AddTotbCCHistoricoAtendimento(objC);
                contexto.SaveChanges();
            }
        }
        #endregion

        #region selectHistoricoAtendimento
        /// <summary>
        ///Seleciona o Historico de atendimento por Campanha Cliente Operador
        /// </summary>
        /// <param name="obHa"></param>
        /// <returns></returns>
        public IList<HistoricoAtendimento> selectHistoricoAtendimento(HistoricoAtendimento obHa)
        {
            using (CallcenterEntities data = new CallcenterEntities())
            {

                IQueryable<tbCCHistoricoAtendimento> consulta = (from tb in data.tbCCHistoricoAtendimento
                                                                 where (tb.idCampanha == obHa.idCampanha || obHa.idCampanha == 0) &&
                                                                       (tb.idCliente == obHa.idCliente || obHa.idCliente == 0) &&
                                                                       (tb.idOperador == obHa.idOperador || obHa.idOperador == 0) &&
                                                                       (tb.idStatus == obHa.idStatus || obHa.idStatus == 0)
                                                                 select tb);

                var listaRetorno = PopulaObjeto(consulta);
                return listaRetorno;
            }
        }
        #endregion

        #region selectHistoricoAtendimentoFiltro
        public IList<HistoricoAtendimento> selectHistoricoAtendimentoFiltro(FiltroHistoricoAtendimento obFiltro)
        {
            using (CallcenterEntities data = new CallcenterEntities())
            {
                var consulta = (from tb in data.tbCCHistoricoAtendimento
                                where (obFiltro.idStatus.Contains(tb.idStatus) || obFiltro.idStatus.Count.Equals(0))
                                && (obFiltro.idCampanha.Contains(tb.idCampanha) || obFiltro.idCampanha.Count.Equals(0))
                                && (obFiltro.idAtendente.Contains(tb.idOperador) || obFiltro.idAtendente.Count.Equals(0))
                                && (obFiltro.idCliente.Contains(tb.idCliente) || obFiltro.idCliente.Count.Equals(0))
                                && (tb.idProposta == obFiltro.idProposta || obFiltro.idProposta.Equals(0))
                                && (((obFiltro.dataDe != null && obFiltro.dataAte != null) ?
                                (tb.dtHistorico >= obFiltro.dataDe && tb.dtHistorico <= obFiltro.dataAte) :
                                (obFiltro.dataDe != null) ? tb.dtHistorico >= obFiltro.dataDe : tb.dtHistorico <= obFiltro.dataAte)
                                || (obFiltro.dataDe == null && obFiltro.dataAte == null))
                                && (obFiltro.tipoProposta.Equals(1) ? tb.idProposta > 0 : !obFiltro.tipoProposta.Equals(2) || tb.idProposta == 0)
                                select new HistoricoAtendimento
                                           {
                                               idHistoricoAtendimento = tb.idHistoricoAtendimento,
                                               idCampanha = tb.idCampanha,
                                               idOperador = tb.idOperador,
                                               idStatus = tb.idStatus,
                                               idCliente = tb.idCliente,
                                               idProposta = tb.idProposta,
                                               nomeCampanha = tb.tbCCCampanha.nomeCampanha,
                                               nomeCliente = tb.CCCliente_Callcenter.Nome,
                                               nomeOperador = tb.tbCCAtendente.Nome,
                                               nomeStatus = tb.tbCCStatusAtendimento.nome,
                                               dtInicioAtendimento = tb.dtInicioAtendimento,
                                               dtHistorico = tb.dtHistorico
                                           }).OrderByDescending(c => c.dtHistorico).ToList();

                return consulta;
            }
        }
        #endregion

        #region selectTempoTotalHistoricoAtendimentoFiltro
        public int selectTempoTotalHistoricoAtendimentoFiltro(FiltroHistoricoAtendimento obFiltro)
        {
            using (CallcenterEntities data = new CallcenterEntities())
            {
                var consulta = (from tb in data.tbCCHistoricoAtendimento
                                where (obFiltro.idStatus.Contains(tb.idStatus) || obFiltro.idStatus.Count.Equals(0))
                                && (obFiltro.idCampanha.Contains(tb.idCampanha) || obFiltro.idCampanha.Count.Equals(0))
                                && (obFiltro.idAtendente.Contains(tb.idOperador) || obFiltro.idAtendente.Count.Equals(0))
                                && (obFiltro.idCliente.Contains(tb.idCliente) || obFiltro.idCliente.Count.Equals(0))
                                && (tb.idProposta == obFiltro.idProposta || obFiltro.idProposta.Equals(0))
                                && (((obFiltro.dataDe != null && obFiltro.dataAte != null) ?
                                (tb.dtHistorico >= obFiltro.dataDe && tb.dtHistorico <= obFiltro.dataAte) :
                                (obFiltro.dataDe != null) ? tb.dtHistorico >= obFiltro.dataDe : tb.dtHistorico <= obFiltro.dataAte)
                                || (obFiltro.dataDe == null && obFiltro.dataAte == null))
                                && (obFiltro.tipoProposta.Equals(1) ? tb.idProposta > 0 : !obFiltro.tipoProposta.Equals(2) || tb.idProposta == 0)
                                select System.Data.Objects.SqlClient.SqlFunctions.DateDiff("s", tb.dtInicioAtendimento, tb.dtHistorico)).ToList().Sum().Value;

                return consulta;
            }
        }
        #endregion

        #region selectRankingHistoricoAtendimentoFiltro
        public IList<HistoricoAtendimento> selectRankingHistoricoAtendimentoFiltro(FiltroHistoricoAtendimento obFiltro)
        {
            using (CallcenterEntities data = new CallcenterEntities())
            {
                var consulta = (from tb in data.tbCCHistoricoAtendimento
                                where (obFiltro.idStatus.Contains(tb.idStatus) || obFiltro.idStatus.Count.Equals(0))
                                      &&
                                      (obFiltro.idCampanha.Contains(tb.idCampanha) ||
                                       obFiltro.idCampanha.Count.Equals(0))
                                      &&
                                      (obFiltro.idAtendente.Contains(tb.idOperador) ||
                                       obFiltro.idAtendente.Count.Equals(0))
                                      &&
                                      (obFiltro.idCliente.Contains(tb.idCliente) || obFiltro.idCliente.Count.Equals(0))
                                      && (tb.idProposta == obFiltro.idProposta || obFiltro.idProposta.Equals(0))
                                      && (((obFiltro.dataDe != null && obFiltro.dataAte != null)
                                               ? (tb.dtHistorico >= obFiltro.dataDe &&
                                                  tb.dtHistorico <= obFiltro.dataAte)
                                               : (obFiltro.dataDe != null)
                                                     ? tb.dtHistorico >= obFiltro.dataDe
                                                     : tb.dtHistorico <= obFiltro.dataAte)
                                          || (obFiltro.dataDe == null && obFiltro.dataAte == null))
                                && (obFiltro.tipoProposta.Equals(1) ? tb.idProposta > 0 : !obFiltro.tipoProposta.Equals(2) || tb.idProposta == 0)
                                let dateDiff = System.Data.Objects.SqlClient.SqlFunctions.DateDiff("s", tb.dtInicioAtendimento, tb.dtHistorico)
                                where dateDiff != null
                                group new { dateDiff }
                                by new { tb.idCampanha, tb.tbCCCampanha.nomeCampanha, tb.idOperador, tb.tbCCAtendente.Nome } into g
                                select new HistoricoAtendimento
                                           {
                                               idCampanha = g.Key.idCampanha,
                                               nomeCampanha = g.Key.nomeCampanha,
                                               idOperador = g.Key.idOperador,
                                               nomeOperador = g.Key.Nome,
                                               segundosAtendimento = g.Sum(c => c.dateDiff).Value
                                           }).OrderByDescending(c => c.segundosAtendimento).ToList();

                return consulta;
            }
        }
        #endregion

        #region SelectHistoricoStatus
        public IList<StatusAtendimento> SelectHistoricoStatus()
        {
            var contexto = new CallcenterEntities();

            var status = (from tb in contexto.tbCCHistoricoAtendimento
                          join tb2 in contexto.tbCCStatusAtendimento on tb.idStatus equals tb2.idStatus
                          select new StatusAtendimento { idStatus = tb2.idStatus, nome = tb2.nome }).Distinct().OrderBy(c => c.nome).ToList();

            return status;
        }
        #endregion

        #region SelectHistoricoCampanha
        public IList<Campanha> SelectHistoricoCampanha()
        {
            var contexto = new CallcenterEntities();

            var campanha = (from tb in contexto.tbCCHistoricoAtendimento
                            join tb2 in contexto.tbCCCampanha on tb.idCampanha equals tb2.idCampanha
                            select new Campanha { idCampanha = tb2.idCampanha, nomeCampanha = tb2.nomeCampanha }).Distinct().OrderBy(c => c.nomeCampanha).ToList();

            return campanha;
        }
        #endregion

        #region SelectHistoricoAtendente
        public IList<Atendente> SelectHistoricoAtendente()
        {
            var contexto = new CallcenterEntities();

            var atendente = (from tb in contexto.tbCCHistoricoAtendimento
                             join tb2 in contexto.tbCCAtendente on tb.idOperador equals tb2.idAtendente
                             select new Atendente { idAtendente = tb2.idAtendente, NomeAtendente = tb2.Nome }).Distinct().OrderBy(c => c.NomeAtendente).ToList();

            return atendente;
        }
        #endregion

        #region SelectHistoricoCliente
        public IList<Cliente> SelectHistoricoCliente()
        {
            var contexto = new CallcenterEntities();

            var cliente = (from tb in contexto.tbCCHistoricoAtendimento
                           join tb2 in contexto.CCCliente_Callcenter on tb.idCliente equals tb2.idCliente
                           select new Cliente { idCliente = tb2.idCliente, nmCliente = tb2.Nome }).Distinct().OrderBy(c => c.nmCliente).ToList();

            return cliente;
        }
        #endregion

        #region PopulaObjeto
        protected static tbCCHistoricoAtendimento PopulaObjeto(HistoricoAtendimento obj, tbCCHistoricoAtendimento tabela)
        {
            tabela.idCampanha = obj.idCampanha;
            tabela.idCliente = obj.idCliente;
            tabela.idOperador = obj.idOperador;
            tabela.idProposta = obj.idProposta;
            tabela.idStatus = obj.idStatus;
            tabela.comentario = obj.comentario;
            tabela.dtHistorico = obj.dtHistorico;
            tabela.dtInicioAtendimento = obj.dtInicioAtendimento;
            return tabela;
        }


        protected static IList<HistoricoAtendimento> PopulaObjeto(IQueryable<tbCCHistoricoAtendimento> reader)
        {
            IList<HistoricoAtendimento> list = new List<HistoricoAtendimento>();
            foreach (var obj in reader)
            {
                var tabela = new HistoricoAtendimento();
                tabela.idHistoricoAtendimento = obj.idHistoricoAtendimento;
                tabela.idCampanha = obj.idCampanha;
                tabela.idCliente = obj.idCliente;
                tabela.idOperador = obj.idOperador;
                tabela.idProposta = obj.idProposta;
                tabela.idStatus = obj.idStatus;
                tabela.comentario = obj.comentario;
                tabela.dtHistorico = obj.dtHistorico;
                tabela.dtInicioAtendimento = obj.dtInicioAtendimento;
                list.Add(tabela);
            }
            return list;
        }
        #endregion

    }
}